//
//  BPUserInfoViewModel.swift
//  BPWeiBo
//
//  Created by 扒皮大叔 on 16/4/10.
//  Copyright © 2016年 apple. All rights reserved.

//mvvm
//非常多的界面都会找viewmodel获取数据
//viewModel 处理业务逻辑 ,网络请求,数据缓存
let userInfoKey = "com.itheima.userifonKey"
import UIKit
import SVProgressHUD
class BPUserInfoViewModel: NSObject {
    //为了方便我们以后的视图和控制器去使用它,就给它设置成为单例
    static let sharedUserInfoViewModel: BPUserInfoViewModel = BPUserInfoViewModel()
    
    //为了防止我们存储数据的时候,总未登陆状态到登陆状态模型为空的问题,需要将我们的单例对象的用户账户的模型属性赋值
    var userInfo : BPUserInfo?
    
    //图片的URL
    var imgUrl : NSURL? {
        let url = NSURL(string: self.userInfo?.avatar_large ?? "")
        
        return url
    }
    //重写构造函数,让我们的模型属性在加载完后就有值
    private override init() {
        super.init()
        
        userInfo = loadUserInfoInDocument()
    }
    
    //添加一个计算性属性(只读属性)
    var userLogin: Bool {
        //1.UserAccount的token 如果不为空 && 用户token不过期 用户已经登录
        //  没有过期  -> 过期日期(2016.4.22) 和 当前日期(2016.4.11)比较  -> 过期日期大于 当前日期
        //2.还要判断token是否过期
        if let u = userInfo where u.expires_data?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
        return true
        }
        
        //将userinfo设置为nil
        userInfo = nil
        return false
    }
}

//MARK:用户相关

extension BPUserInfoViewModel {
    
    //MARK:通过身份令牌,获取AccessToken返回的数据
    //因为我们在获取身份令牌的时候需要 判断是否获取到了成功的数据,有时候我们可能获取到了的不完整额数据,就存在偏好设置中,但是偏好设置中不能为空所以我们在存入的时候要进行判断
    func loadAccessToken(code: String,finished:(isSuccess: Bool) -> ()) {
        
        //通过我们封装的网络请求的工具类来获取数据
        BPAFNetworkingTool.sharedTools.loadAccessTokenNet(code) { (respondData, error) -> () in
            if error != nil {
                print(error)
                //如果不成功就给我们的闭包的bool值传一个false
                finished(isSuccess: false)
                SVProgressHUD.showErrorWithStatus("世界上最遥远的距离是我不在你身边")
                return
            }

            //执行到这里就表示授权成功
            print("授权成功")
            //print(respondData)
            //将结果解析出来
            self.loadResult(respondData!, finished: finished)
        }
    }
    
    //MARK:将解析出来的数据,转化成swift能够识别的数据
    private func loadResult(respondData: AnyObject,finished:(isSuccess: Bool) -> ()) {
        
        //1.将结果转化成字典
        guard let dic = respondData as? [String : AnyObject] else {
            //如果转化不成功就给我们的闭包的bool值传一个false
            finished(isSuccess: false)
            //SVProgressHUD.showErrorWithStatus("数据解析错误")
            return
        }
        //2.如果执行到这里就表示转换成功,
        //因为返回的数据里.AFN自动将数据转化成字典了所以我们只需要取对应的值就行
        let token = dic["access_token"]!
        print(token)
        let uid = dic["uid"]!
        //请求数据
        BPAFNetworkingTool.sharedTools.loadUserInfomation(token, uid: uid) { (respondData, error) -> () in
            if error != nil {
                print(error)
                //SVProgressHUD.showErrorWithStatus("世界上最遥远的距离就是没有网络")
                return
            }

            //print("获取用户信息成功")
            //print(respondData)
            //获取到成功的数据文件后,AFN默认返回的是一个子典,我们根据自己的需要将使用里面的数据
            //首先将AnyObject?其转换成字典类型
            guard var userInfoDict = respondData as? [String : AnyObject]  else

            {
                //如果转换失败就给我们的闭包的参数传一个false
                finished(isSuccess: false)
                return
                //SVProgressHUD.showErrorWithStatus("数据结构错误")
            }

            //执行到这里,表示转换成功
            //然后将这个分散的字典进行合并一下
            for (k,v) in dic {
                userInfoDict[k] = v
            }
            
            //print(userInfoDict)
            //然后将数据存储起来
            self.saveData(userInfoDict)
            
            //然后当上面所有的操作都执行成功以后再给我们的闭包传一个ture的值
            finished(isSuccess: true)
        }
        
    }
}

//MARK:将存储数据, 获取数据封装在一个分类中,放在分类中只是为了更好的分模块化管理

extension BPUserInfoViewModel {
    
    func saveData(userInfoDict: [String : AnyObject]) {
        //print(userInfoDict)
        //将获取到的完整的信息存储到偏好设置中
        let userDefaults =  NSUserDefaults.standardUserDefaults()
        
        //字典转模型
        let userInfo1 = BPUserInfo(dict: userInfoDict)
        
        
        //将我们已经加载完毕的模型对象赋值给我们可能为空的模型字典,这样就不会报错
        self.userInfo = userInfo1
        
        let keys = ["access_token","expires_in","uid","name","avatar_large","expires_data"]
        
        //这里会报错,因为偏好设置数据里面为空
        let dict = userInfo1.dictionaryWithValuesForKeys(keys)
        
        //将数据保存到偏好设置中
        userDefaults.setObject(dict, forKey:userInfoKey)
        
        //同步
        userDefaults.synchronize()
        
        print(NSHomeDirectory())

    }
    
    //MARK:获取沙盒中存储的数据
    func loadUserInfoInDocument() -> BPUserInfo? {
        //获取偏好设置
        let userDefault = NSUserDefaults.standardUserDefaults()
        
        guard let dict = userDefault.objectForKey(userInfoKey) as? [String : AnyObject] else {
            return nil
        }
        
        let userInfomation = BPUserInfo(dict: dict)
        return userInfomation
    }

}
